首先,先讓我們新創立一個餐廳的 app :
python manage.py startapp restaurants
創立完 app 後,別忘了把它加入 settings.py 內的 installed_apps 裡面:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
'restaurants' #加入
]
接著,讓我們進入 restaurants 的資料夾內,建立一個名為 models.py 的檔案:
from django.db import models
class Restaurant(models.Model):
name = models.CharField(max_length=20) #餐廳名稱
phone_number = models.CharField(max_length=15) #餐廳電話
address = models.CharField(max_length=50, blank=True) #餐廳地址
class Food(models.Model):
name = models.CharField(max_length=20) #食物名稱
price=models.DecimalField(max_digits=3,decimal_places=0) #食物價錢
is_spicy = models.BooleanField(default=False) #會不會辣
food_restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE) #由哪個餐廳製作
我們在此定義了該 model 所有的 class 的各個欄位型態,值得一題的是 ForeignKey 指的是多對一(many-to-one)的關係,它限制欄位值只能來自另一個資料表的主鍵欄位。而 on_delete=models.CASCADE 指的是當對應的類別被刪除後,這筆資料也跟著一倂刪除的意思。
(也就是說當製作該道食物的餐廳倒閉,這道食物自然也就吃不到了。)
之後,在準備建立資料檔時,可以先檢查自己的設計的model有沒有問題:
python manage.py check
接下來,建立 migration 記錄檔,確保資料表的架構和版本有被記錄下來:
python manage.py makemigrations restaurants
然後,正式將模型與資料庫同步:
python manage.py migrate restaurants 0001
0001是版本編號,使用了migrate指令,就能夠根據模型的更動,將現行的資料庫調整到與記錄檔一樣。若不指定編號,則自動更新到最新版本。
首先,進入 Django shell 中:
python manage.py shell
引入我們剛才建立的 models.py 當中的類別:
>>> from restaurants.models import Restaurant, Food
接著,建立第1筆模型資料並儲存:
>>> restaurant1=Restaurant(name='一號店', phone_number='01-1111111', address='一號路')
>>> restaurant1.save()
接著,當我們察看資料庫時,會發現多了一筆資料:
>>> Restaurant.objects.all()
<QuerySet [<Restaurant: Restaurant object (1)>]>
當然,也有另一種新增方法:
restaurant2=Restaurant.objects.create(name='二號店', phone_number='02-2222222', address='二號路')
objects 為管理器,擁有關於查詢該模型資料的各種方法,接下來我們都將用 objects 進行操作。
如果想更新資料,可以用 filter 對資料過慮並搜尋,然後透過 update 更新:
Restaurant.objects.filter(address='一號路').update(address='一號巷')
接著,讓我們來看看更新後的資料:
>>> r1 = Restaurant.objects.get(name='一號店')
>>> r1.address
'一號巷'
刪除資料的方法:
Restaurant.objects.get(name='一號店').delete()
接下來,為了使資料更好分辨,讓我們修改一下 models.py :
from django.db import models
class Restaurant(models.Model):
name = models.CharField(max_length=20) #餐廳名稱
phone_number = models.CharField(max_length=15) #餐廳電話
address = models.CharField(max_length=50, blank=True) #餐廳地址
def __str__(self): #新增
return self.name
class Food(models.Model):
name = models.CharField(max_length=20) #食物名稱
price=models.DecimalField(max_digits=3,decimal_places=0) #食物價錢
is_spicy = models.BooleanField(default=False) #會不會辣
food_restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE) #由哪個餐廳製作
def __str__(self): #新增
return self.name
接著用 exit()
離開,並利用 python manage.py shell
重新進入 shell 中。
此時我們就能發現因為__str__函式的緣故,顯示出來的資訊好看多了!
>>> from restaurants.models import Restaurant, Food
>>> Restaurant.objects.all()
<QuerySet [<Restaurant: 二號店>]>
緊接著,創建一些 food 的資料:
>>> r2 = Restaurant.objects.get(name='二號店')
>>> food = Food.objects.create(name='便當', price='60', is_spicy=False, food_restaurant=r2)
>>> food.food_restaurant.name
'二號店'
藉由上述的程式,可以發現我們能透過食物關聯到餐廳,並取得餐廳的名子。
今天的介紹就到這裡,明天就30天了解脫拉。:.゚ヽ(*´∀`)ノ゚.:。!